package com.heima.interceptor;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.heima.thread.UserThreadLocal;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 定义一个拦截器，实现 HandlerInterceptor
 */

public class TokenInfoInterceptor implements HandlerInterceptor {

    // 前置拦截
    // 主要做的事：获取从gateway传递过来的用户信息
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 提取请求头上面的token字段
        String token = request.getHeader("token");

        // 校验token是否有效，有效是true， 无效是false
        // 参数一：要校验的token
        // 参数二：秘钥(注意，这个秘钥要和生成token时那个秘钥保持一致（HhUsersServiceImpl 165行）)
        boolean verify = JWTUtil.verify(token, "heima".getBytes());
        if (!verify) {
            System.out.println("token校验失败");
            return false;
        }

        // 提取token中的载荷信息
        // base64码 -> JSON形式的用户信息 -> 映射到JWT对象上(Map结构)
        JWT jwt = JWTUtil.parseToken(token);
        // 提取载荷中，某个字段的内容
        // 载荷，是用户信息的JSON字符串，通过base64编码得来的
        Integer id = (Integer) jwt.getPayload("id");

        // 把提取到的id，放到全局变量ThreadLocal里面
        UserThreadLocal.setUserLocal(id);
        return true;
    }

    // 完成时拦截
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }
}
